package cn.biplam.front.htmlscript;

import java.util.ArrayList;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.front.htmlscript.script.ScriptSentence;

/**
 * Html页面中的JavaScript脚本
 * @author 	WangSong
 * @create 	2009-3-21 上午10:19:45
 * @version 1.0
 */
public class HtmlScript{

	/**
	 * 脚本模式(Import/Declare)
	 */
	public enum Script_Type{
		/**页面内直接声明 */
		Declare,
		/**外部文件导入 */
		Import;
	} 
	/**脚本容器 */
	private ArrayList<String> binds;

	/**脚本对象模式选择 */
	private Script_Type ScriptModel;

	/**导入模式的导入文件url */
	private String sFileUrl=null;

	/**
	 * 功能：构造方法	传入脚本ArrayList初始化
	 * @param scripts
	 */
	public HtmlScript(ArrayList<String> scripts){
		this.ScriptModel=Script_Type.Declare;
		this.binds=scripts;
	}

	/**
	 * 功能：构造方法 指定脚本对象的模式
	 * @see this.Scrip_*
	 * @param Script_Model
	 */
	public HtmlScript(Script_Type Script_Model){
		this.ScriptModel=Script_Model;
	}

	/**
	 * 功能：构造方法 传入一个脚本文件Url或者一个脚本文本初始化
	 * @param sParam		文件URL/Script脚本
	 * @throws ErrorMessage 
	 */
	public HtmlScript(Script_Type Script_Model,String sParam) throws ErrorMessage{
		this.ScriptModel=Script_Model;
		switch(Script_Model){
		case Import:
			this.sFileUrl=sParam;
			break;
		case Declare:
			this.put(sParam);
		}
	}

	/**
	 * 功能：构造方法 传入一个Script语句对象初始化
	 * @param mSentence
	 * @throws ErrorMessage
	 */
	public HtmlScript(ScriptSentence mSentence) throws ErrorMessage{
		this.ScriptModel=Script_Type.Declare;
		this.put(mSentence);
	}

	/**
	 * 功能：构造方法 传入一个脚本字符串初始化
	 * @param sScript
	 * @throws ErrorMessage
	 */
	public HtmlScript(String sScript) throws ErrorMessage{
		this.ScriptModel=Script_Type.Declare;
		this.put(sScript);
	}

	/**
	 * 功能：构造方法 传入文件url和网站主目录路径初始化
	 * @param sFileUrl		文件url
	 * @param sHomePath		网站主目录
	 */
	public HtmlScript(String sFileUrl,String sHomePath){
		this.put(sFileUrl, sHomePath);
	}

	/**
	 * 功能：获取对象及其内容的 HTML 形式
	 * @return
	 * @throws ErrorMessage
	 */
	public String draw() throws ErrorMessage {
		StringBuilder sb = new StringBuilder();
		switch(this.ScriptModel){
		case Import:	//外部文件模式
			sb.append("<SCRIPT src=\"");
			sb.append(this.sFileUrl);
			sb.append("\" type=text/javascript charset='utf-8'></SCRIPT>\n");
			break;
		case Declare: //声明模式
			if(this.binds!=null){
				sb.append("<SCRIPT>\n");
				this.getContent(sb);
				sb.append("</SCRIPT>\n");
			}
		}
		return sb.toString();
	}
	
	/**
	 * 功能：获取位于对象起始和结束标签内的 HTML
	 * @param sb
	 * @throws ErrorMessage
	 */
	public void getContent(StringBuilder sb) throws ErrorMessage {
		switch(this.ScriptModel){
		case Import:	//外部文件模式
			break;
		case Declare: //声明模式
			for(String ite:this.binds){
				sb.append(ite);
				sb.append("\n");
			}
		}
	}

	/**
	 * 功能： 返回脚本对象的类型(import/declare)
	 * @return
	 */
	public Script_Type getScriptModel() {
		return ScriptModel;
	}

	/**
	 * 功能：放入一个ScriptSentence对象
	 * @param html
	 * @throws ErrorMessage
	 */
	public void put(ScriptSentence mSentence) throws ErrorMessage {
		this.put(mSentence.draw());
	}

	/**
	 * 功能：放入一段Script文本
	 * @param sScript
	 * @throws ErrorMessage 
	 */
	public void put(String sScript) throws ErrorMessage{
		if(this.ScriptModel==Script_Type.Import){
			//TODO 设置异常类型
			throw new ErrorMessage("不允许向import类型的Script放入script文本!");
		}
		if(this.binds==null){
			this.binds=new ArrayList<String>();
		}
		this.binds.add(sScript);
	}

	/**
	 * 功能：设置文件导入模式脚本
	 * @param sFileUrl		文件url
	 * @param sHomePath		网站主目录
	 */
	public void put(String sFileUrl,String sHomePath){
		this.ScriptModel=Script_Type.Import;
		StringBuilder sb = new StringBuilder();
		sb.append(sHomePath);
		sb.append(sFileUrl);
		this.sFileUrl=sb.toString();
	}

}
